// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/cast/test/utility/standalone_cast_environment.h"

#include "base/memory/ptr_util.h"
#include "base/time/default_tick_clock.h"

namespace media {
namespace cast {

    StandaloneCastEnvironment::StandaloneCastEnvironment()
        : CastEnvironment(
            base::WrapUnique<base::TickClock>(new base::DefaultTickClock()),
            NULL,
            NULL,
            NULL)
        , main_thread_("StandaloneCastEnvironment Main")
        , audio_thread_("StandaloneCastEnvironment Audio")
        , video_thread_("StandaloneCastEnvironment Video")
    {
#define CREATE_TASK_RUNNER(name, options)     \
    name##_thread_.StartWithOptions(options); \
    CastEnvironment::name##_thread_proxy_ = name##_thread_.task_runner()

        CREATE_TASK_RUNNER(main,
            base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
        CREATE_TASK_RUNNER(audio, base::Thread::Options());
        CREATE_TASK_RUNNER(video, base::Thread::Options());
#undef CREATE_TASK_RUNNER
    }

    StandaloneCastEnvironment::~StandaloneCastEnvironment()
    {
        CHECK(CalledOnValidThread());
        CHECK(!main_thread_.IsRunning());
        CHECK(!audio_thread_.IsRunning());
        CHECK(!video_thread_.IsRunning());
    }

    void StandaloneCastEnvironment::Shutdown()
    {
        CHECK(CalledOnValidThread());
        main_thread_.Stop();
        audio_thread_.Stop();
        video_thread_.Stop();
    }

} // namespace cast
} // namespace media
